import jmespath

# 就是为了处理json数据的，用来查找json中的 value，同jsonpath

# jmespath.search('jmespath表达式','数据源')

data = {
    "a": {
        "b": {
            "c": [
                {"d": [0, [1, 2, 3, [4]]]},
                {"e": [5, 6]}
            ]
        }
    }
}

'''基本查找'''
# 与jsonpath基本一致,省略了 $
print(jmespath.search('a.b.c[0].d[1][3][0]', data))

'''高级查找'''
# 1.投影: 当你不确定你要查找的元素在列表中第一个时,可以使用 [*],字典的投影 .*
data1 = {
    'items': [
        [
            {'name': 'item1', 'value': 1},
            {'name': 'item2', 'value': 2},
        ],
        [
            {'name': 'item3', 'value': 3},
            {'name': 'item4', 'value': 4},
        ]
    ]
}

# 在data1 查找所有key是"value"的 值是什么
print(jmespath.search('items[*][*].value', data1))
# 在data1 查找所有keyd的值是什么(最外层的items除外)
print(jmespath.search('items[*][*].*', data1)) # [[['item1', 1], ['item2', 2]], [['item3', 3], ['item4', 4]]]

# 2.展平:当列表中有嵌套列表时,可以使用 [] 对其展开
print(jmespath.search('items[*][*].*[][]', data1))

# 3.过滤: jsonpath的过滤[?(@key==value)]  jmespath的过滤:[?key==`value`]
# 查找data1 name是item3 的 value的值
print(jmespath.search('items[*][?name==`item3`].value',data1)) # [[], [3]]

# 4.管道符
# 解决上边的问题
print(jmespath.search('items[*][?name==`item3`].value | [1][0]',data1))